/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * Copyright (c) 2002-2017 Pentaho Corporation.. All rights reserved. */ package org.pentaho.mantle.client.ui.xul; import com.google.gwt.core.client.GWT; import com.google.gwt.core.client.JavaScriptObject; import com.google.gwt.core.client.JsArray; import com.google.gwt.core.client.JsonUtils; import com.google.gwt.core.client.RunAsyncCallback; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; import com.google.gwt.http.client.RequestCallback; import com.google.gwt.http.client.RequestException; import com.google.gwt.http.client.Response; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONParser; import com.google.gwt.user.client.Command; import com.google.gwt.user.client.Element; import com.google.gwt.user.client.Timer; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.MenuBar; import com.google.gwt.user.client.ui.MenuItem; import com.google.gwt.user.client.ui.Widget; import org.pentaho.gwt.widgets.client.dialogs.MessageDialogBox; import org.pentaho.gwt.widgets.client.menuitem.PentahoMenuItem; import org.pentaho.gwt.widgets.client.utils.string.StringTokenizer; import org.pentaho.mantle.client.admin.ContentCleanerPanel; import org.pentaho.mantle.client.admin.EmailAdminPanelController; import org.pentaho.mantle.client.admin.ISysAdminPanel; import org.pentaho.mantle.client.admin.JsSysAdminPanel; import org.pentaho.mantle.client.admin.UserRolesAdminPanelController; import org.pentaho.mantle.client.commands.ShowBrowserCommand; import org.pentaho.mantle.client.commands.SwitchLocaleCommand; import org.pentaho.mantle.client.commands.SwitchThemeCommand; import org.pentaho.mantle.client.events.EventBusUtil; import org.pentaho.mantle.client.events.FavoritesChangedEvent; import org.pentaho.mantle.client.events.PerspectivesLoadedEvent; import org.pentaho.mantle.client.events.PerspectivesLoadedEventHandler; import org.pentaho.mantle.client.events.RecentsChangedEvent; import org.pentaho.mantle.client.events.UserSettingsLoadedEvent; import org.pentaho.mantle.client.events.UserSettingsLoadedEventHandler; import org.pentaho.mantle.client.messages.Messages; import org.pentaho.mantle.client.solutionbrowser.SolutionBrowserPanel; import org.pentaho.mantle.client.solutionbrowser.filelist.FileCommand.COMMAND; import org.pentaho.mantle.client.solutionbrowser.filepicklist.AbstractFilePickList; import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickItem; import org.pentaho.mantle.client.solutionbrowser.filepicklist.FavoritePickList; import org.pentaho.mantle.client.solutionbrowser.filepicklist.IFilePickItem; import org.pentaho.mantle.client.solutionbrowser.filepicklist.IFilePickListListener; import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickItem; import org.pentaho.mantle.client.solutionbrowser.filepicklist.RecentPickList; import org.pentaho.mantle.client.ui.PerspectiveManager; import org.pentaho.mantle.client.usersettings.IMantleUserSettingsConstants; import org.pentaho.mantle.client.usersettings.JsSetting; import org.pentaho.mantle.client.usersettings.UserSettingsManager; import org.pentaho.ui.xul.XulComponent; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.binding.BindingFactory; import org.pentaho.ui.xul.components.XulMenuitem; import org.pentaho.ui.xul.components.XulToolbarbutton; import org.pentaho.ui.xul.containers.XulMenubar; import org.pentaho.ui.xul.gwt.GwtXulDomContainer; import org.pentaho.ui.xul.gwt.binding.GwtBindingFactory; import org.pentaho.ui.xul.gwt.tags.GwtConfirmBox; import org.pentaho.ui.xul.gwt.tags.GwtMessageBox; import org.pentaho.ui.xul.impl.AbstractXulEventHandler; import org.pentaho.ui.xul.stereotype.Bindable; import org.pentaho.ui.xul.util.XulDialogCallback; import java.util.HashMap; import java.util.Map; public class MantleController extends AbstractXulEventHandler { private MantleModel model; private XulToolbarbutton openBtn; private XulToolbarbutton newBtn; private XulToolbarbutton saveBtn; private XulToolbarbutton saveAsBtn; private XulToolbarbutton newAdhocBtn; private XulToolbarbutton contentEditBtn; private XulToolbarbutton printBtn; private XulMenuitem saveMenuItem; private XulMenuitem saveAsMenuItem; private XulMenuitem useDescriptionsMenuItem; private XulMenuitem showHiddenFilesMenuItem; private XulMenubar languageMenu; private XulMenubar themesMenu; private XulMenubar toolsMenu; private XulMenubar recentMenu; private XulMenubar favoriteMenu; private BindingFactory bf; private String overrideContentPanelId; private String overrideContentUrl; HashMap<String, ISysAdminPanel> sysAdminPanelsMap = new HashMap<String, ISysAdminPanel>(); RecentPickList recentPickList = RecentPickList.getInstance(); FavoritePickList favoritePickList = FavoritePickList.getInstance(); class SysAdminPanelInfo { String id; String url; public SysAdminPanelInfo() { }; public SysAdminPanelInfo( String panelId, String panelUrl ) { id = panelId; url = panelUrl; }; } SysAdminPanelInfo adminPanelAwaitingActivation = null; public MantleController( MantleModel model ) { this.model = model; } /** * Called when the Xul Dom is ready, grab all Xul references here. */ @Bindable public void init() { openBtn = (XulToolbarbutton) document.getElementById( "openButton" ); //$NON-NLS-1$ newBtn = (XulToolbarbutton) document.getElementById( "newButton" ); //$NON-NLS-1$ saveBtn = (XulToolbarbutton) document.getElementById( "saveButton" ); //$NON-NLS-1$ saveAsBtn = (XulToolbarbutton) document.getElementById( "saveAsButton" ); //$NON-NLS-1$ printBtn = (XulToolbarbutton) document.getElementById( "printButton" ); contentEditBtn = (XulToolbarbutton) document.getElementById( "editContentButton" ); //$NON-NLS-1$ bf = new GwtBindingFactory( document ); bf.createBinding( model, "saveEnabled", saveBtn, "!disabled" ); //$NON-NLS-1$ //$NON-NLS-2$ bf.createBinding( model, "saveAsEnabled", saveAsBtn, "!disabled" ); //$NON-NLS-1$ //$NON-NLS-2$ bf.createBinding( model, "contentEditEnabled", contentEditBtn, "!disabled" ); //$NON-NLS-1$ //$NON-NLS-2$ bf.createBinding( model, "contentEditSelected", this, "editContentSelected" ); //$NON-NLS-1$ //$NON-NLS-2$ bf.createBinding( model, "printVisible", printBtn, "visible" ); saveMenuItem = (XulMenuitem) document.getElementById( "saveMenuItem" ); //$NON-NLS-1$ saveAsMenuItem = (XulMenuitem) document.getElementById( "saveAsMenuItem" ); //$NON-NLS-1$ useDescriptionsMenuItem = (XulMenuitem) document.getElementById( "useDescriptionsMenuItem" ); //$NON-NLS-1$ showHiddenFilesMenuItem = (XulMenuitem) document.getElementById( "showHiddenFilesMenuItem" ); //$NON-NLS-1$ languageMenu = (XulMenubar) document.getElementById( "languagemenu" ); //$NON-NLS-1$ themesMenu = (XulMenubar) document.getElementById( "themesmenu" ); //$NON-NLS-1$ toolsMenu = (XulMenubar) document.getElementById( "toolsmenu" ); //$NON-NLS-1$ recentMenu = (XulMenubar) document.getElementById( "recentmenu" ); //$NON-NLS-1$ favoriteMenu = (XulMenubar) document.getElementById( "favoritesmenu" ); //$NON-NLS-1$ if ( PerspectiveManager.getInstance().isLoaded() ) { PerspectiveManager.getInstance().enablePerspective( PerspectiveManager.OPENED_PERSPECTIVE, false ); } else { EventBusUtil.EVENT_BUS.addHandler( PerspectivesLoadedEvent.TYPE, new PerspectivesLoadedEventHandler() { public void onPerspectivesLoaded( PerspectivesLoadedEvent event ) { PerspectiveManager.getInstance().enablePerspective( PerspectiveManager.OPENED_PERSPECTIVE, false ); } } ); } // install language sub-menus Map<String, String> supportedLanguages = Messages.getResourceBundle().getSupportedLanguages(); if ( supportedLanguages != null && supportedLanguages.keySet() != null && !supportedLanguages.isEmpty() ) { MenuBar langMenu = (MenuBar) languageMenu.getManagedObject(); langMenu.insertSeparator( 0 ); for ( String lang : supportedLanguages.keySet() ) { MenuItem langMenuItem = new MenuItem( supportedLanguages.get( lang ), new SwitchLocaleCommand( lang ) ); langMenuItem.getElement().setId( supportedLanguages.get( lang ) + "_menu_item" ); //$NON-NLS-1$ langMenu.insertItem( langMenuItem, 0 ); } } buildFavoritesAndRecent( false ); UserSettingsManager.getInstance().getUserSettings( new AsyncCallback<JsArray<JsSetting>>() { public void onSuccess( JsArray<JsSetting> settings ) { processSettings( settings ); } public void onFailure( Throwable caught ) { } }, false ); EventBusUtil.EVENT_BUS.addHandler( UserSettingsLoadedEvent.TYPE, new UserSettingsLoadedEventHandler() { public void onUserSettingsLoaded( UserSettingsLoadedEvent event ) { processSettings( event.getSettings() ); } } ); // install themes RequestBuilder getActiveThemeRequestBuilder = new RequestBuilder( RequestBuilder.GET, GWT.getHostPageBaseURL() + "api/theme/active" ); //$NON-NLS-1$ try { getActiveThemeRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); getActiveThemeRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable exception ) { // showError(exception); } public void onResponseReceived( Request request, Response response ) { final String activeTheme = response.getText(); RequestBuilder getThemesRequestBuilder = new RequestBuilder( RequestBuilder.GET, GWT.getHostPageBaseURL() + "api/theme/list" ); //$NON-NLS-1$ getThemesRequestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); getThemesRequestBuilder.setHeader( "accept", "application/json" ); //$NON-NLS-1$ //$NON-NLS-2$ try { getThemesRequestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request arg0, Throwable arg1 ) { } public void onResponseReceived( Request request, Response response ) { try { final String url = GWT.getHostPageBaseURL() + "api/repo/files/canAdminister"; //$NON-NLS-1$ RequestBuilder requestBuilder = new RequestBuilder( RequestBuilder.GET, url ); requestBuilder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); requestBuilder.setHeader( "accept", "text/plain" ); //$NON-NLS-1$ //$NON-NLS-2$ requestBuilder.sendRequest( null, new RequestCallback() { public void onError( Request request, Throwable caught ) { } public void onResponseReceived( Request request, Response response ) { toolsMenu.setVisible( "true".equalsIgnoreCase( response.getText() ) ); //$NON-NLS-1$ showHiddenFilesMenuItem.setVisible( "true".equalsIgnoreCase( response.getText() ) ); //$NON-NLS-1$ } } ); } catch ( RequestException e ) { Window.alert( e.getMessage() ); } JsArray<JsTheme> themes = JsTheme.getThemes( JsonUtils.escapeJsonForEval( response.getText() ) ); for ( int i = 0; i < themes.length(); i++ ) { JsTheme theme = themes.get( i ); PentahoMenuItem themeMenuItem = new PentahoMenuItem( theme.getName(), new SwitchThemeCommand( theme.getId() ) ); themeMenuItem.getElement().setId( theme.getId() + "_menu_item" ); //$NON-NLS-1$ themeMenuItem.setChecked( theme.getId().equals( activeTheme ) ); ( (MenuBar) themesMenu.getManagedObject() ).addItem( themeMenuItem ); } bf.createBinding( model, "saveEnabled", saveMenuItem, "!disabled" ); //$NON-NLS-1$ //$NON-NLS-2$ bf.createBinding( model, "saveAsEnabled", saveAsMenuItem, "!disabled" ); //$NON-NLS-1$ //$NON-NLS-2$ if ( PerspectiveManager.getInstance().isLoaded() ) { executeAdminContent(); } else { EventBusUtil.EVENT_BUS.addHandler( PerspectivesLoadedEvent.TYPE, new PerspectivesLoadedEventHandler() { public void onPerspectivesLoaded( PerspectivesLoadedEvent event ) { executeAdminContent(); } } ); } setupNativeHooks( MantleController.this ); } } ); } catch ( RequestException e ) { // showError(e); } } } ); } catch ( RequestException e ) { Window.alert( e.getMessage() ); // showError(e); } } public void processSettings( JsArray<JsSetting> settings ) { if ( settings == null ) { return; } for ( int i = 0; i < settings.length(); i++ ) { JsSetting setting = settings.get( i ); try { if ( IMantleUserSettingsConstants.MANTLE_SHOW_NAVIGATOR.equals( setting.getName() ) ) { boolean showNavigator = "true".equals( setting.getValue() ); //$NON-NLS-1$ model.setShowNavigatorSelected( showNavigator ); } else if ( IMantleUserSettingsConstants.MANTLE_SHOW_DESCRIPTIONS_FOR_TOOLTIPS.equals( setting.getName() ) ) { boolean checked = "true".equals( setting.getValue() ); //$NON-NLS-1$ ( (PentahoMenuItem) useDescriptionsMenuItem.getManagedObject() ).setChecked( checked ); } else if ( IMantleUserSettingsConstants.MANTLE_SHOW_HIDDEN_FILES.equals( setting.getName() ) ) { boolean checked = "true".equals( setting.getValue() ); //$NON-NLS-1$ ( (PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject() ).setChecked( checked ); } } catch ( Exception e ) { MessageDialogBox dialogBox = new MessageDialogBox( Messages.getString( "error" ), Messages.getString( "couldNotGetUserSettings" ), false, false, true ); //$NON-NLS-1$ //$NON-NLS-2$ dialogBox.center(); } } } /** * * @param force * Force the reload of user settings from server rather than use cache. * */ public void buildFavoritesAndRecent( boolean force ) { loadRecentAndFavorites( force ); refreshPickListMenu( recentMenu, recentPickList, PickListType.RECENT ); refreshPickListMenu( favoriteMenu, favoritePickList, PickListType.FAVORITE ); recentPickList.addPickListListener( new IFilePickListListener<RecentPickItem>() { public void itemsChanged( AbstractFilePickList<RecentPickItem> filePickList ) { refreshPickListMenu( recentMenu, recentPickList, PickListType.RECENT ); recentPickList.save( "recent" ); } public void onSaveComplete( AbstractFilePickList<RecentPickItem> filePickList ) { EventBusUtil.EVENT_BUS.fireEvent( new RecentsChangedEvent() ); } } ); favoritePickList.addPickListListener( new IFilePickListListener<FavoritePickItem>() { public void itemsChanged( AbstractFilePickList<FavoritePickItem> filePickList ) { refreshPickListMenu( favoriteMenu, favoritePickList, PickListType.FAVORITE ); favoritePickList.save( "favorites" ); } public void onSaveComplete( AbstractFilePickList<FavoritePickItem> filePickList ) { EventBusUtil.EVENT_BUS.fireEvent( new FavoritesChangedEvent() ); } } ); } /** * Loads an arbitrary <code>FilePickList</code> into a menu * * @param pickMenu * The XulMenuBar to host the menu entries * @param filePickList * The files to list in natural order */ private void refreshPickListMenu( XulMenubar pickMenu, final AbstractFilePickList<? extends IFilePickItem> filePickList, PickListType type ) { final MenuBar menuBar = (MenuBar) pickMenu.getManagedObject(); menuBar.clearItems(); final String menuClearMessage = Messages.getString( type.getMenuItemKey() ); final String clearMessage = Messages.getString( type.getMessageKey() ); if ( filePickList.size() > 0 ) { for ( IFilePickItem filePickItem : filePickList.getFilePickList() ) { final String text = filePickItem.getFullPath(); menuBar.addItem( filePickItem.getTitle(), new Command() { public void execute() { SolutionBrowserPanel.getInstance().openFile( text, COMMAND.RUN ); } } ); } menuBar.addSeparator(); menuBar.addItem( menuClearMessage, new Command() { public void execute() { // confirm the clear GwtConfirmBox warning = new GwtConfirmBox(); warning.setHeight( 117 ); warning.setMessage( clearMessage ); warning.setTitle( menuClearMessage ); warning.setAcceptLabel( Messages.getString( "clearRecentAcceptButtonLabel" ) ); warning.setCancelLabel( Messages.getString( "clearRecentCancelButtonLabel" ) ); warning.addDialogCallback( new XulDialogCallback<String>() { public void onClose( XulComponent sender, Status returnCode, String retVal ) { if ( returnCode == Status.ACCEPT ) { filePickList.clear(); } } public void onError( XulComponent sender, Throwable t ) { } } ); warning.show(); } } ); } else { menuBar.addItem( Messages.getString( "empty" ), new Command() { //$NON-NLS-1$ public void execute() { // Do nothing } } ); } } private void loadRecentAndFavorites( boolean force ) { UserSettingsManager.getInstance().getUserSettings( new AsyncCallback<JsArray<JsSetting>>() { public void onSuccess( JsArray<JsSetting> result ) { if ( result == null ) { return; } JsSetting setting; for ( int j = 0; j < result.length(); j++ ) { setting = result.get( j ); if ( "favorites".equalsIgnoreCase( setting.getName() ) ) { //$NON-NLS-1$ try { // handle favorite JSONArray favorites = JSONParser.parseLenient( setting.getValue() ).isArray(); if ( favorites != null ) { // Create the FavoritePickList object from the JSONArray favoritePickList = FavoritePickList.getInstanceFromJSON( favorites ); } else { favoritePickList = FavoritePickList.getInstance(); } } catch ( Throwable t ) { //ignore } } else if ( "recent".equalsIgnoreCase( setting.getName() ) ) { //$NON-NLS-1$ try { // handle recent JSONArray recents = JSONParser.parseLenient( setting.getValue() ).isArray(); if ( recents != null ) { // Create the RecentPickList object from the JSONArray recentPickList = RecentPickList.getInstanceFromJSON( recents ); } else { recentPickList = RecentPickList.getInstance(); } recentPickList.setMaxSize( 10 ); } catch ( Throwable t ) { //ignore } } } } public void onFailure( Throwable caught ) { } }, force ); } private void executeAdminContent() { try { RequestCallback internalCallback = new RequestCallback() { public void onError( Request request, Throwable exception ) { } public void onResponseReceived( Request request, Response response ) { JsArray<JsSetting> jsSettings = null; try { jsSettings = JsSetting.parseSettingsJson( response.getText() ); } catch ( Throwable t ) { // happens when there are no settings } if ( jsSettings == null ) { return; } for ( int i = 0; i < jsSettings.length(); i++ ) { String content = jsSettings.get( i ).getValue(); StringTokenizer nameValuePairs = new StringTokenizer( content, ";" ); //$NON-NLS-1$ String perspective = null, content_panel_id = null, content_url = null; for ( int j = 0; j < nameValuePairs.countTokens(); j++ ) { String currentToken = nameValuePairs.tokenAt( j ).trim(); if ( currentToken.startsWith( "perspective=" ) ) { //$NON-NLS-1$ perspective = currentToken.substring( "perspective=".length() ); //$NON-NLS-1$ } if ( currentToken.startsWith( "content-panel-id=" ) ) { //$NON-NLS-1$ content_panel_id = currentToken.substring( "content-panel-id=".length() ); //$NON-NLS-1$ } if ( currentToken.startsWith( "content-url=" ) ) { //$NON-NLS-1$ content_url = currentToken.substring( "content-url=".length() ); //$NON-NLS-1$ } } if ( content_panel_id != null && content_url != null ) { overrideContentPanelId = content_panel_id; overrideContentUrl = content_url; } if ( perspective != null ) { PerspectiveManager.getInstance().setPerspective( perspective ); } if ( perspective == null && content_panel_id == null && content_url == null ) { GwtMessageBox warning = new GwtMessageBox(); warning.setTitle( Messages.getString( "warning" ) ); //$NON-NLS-1$ warning.setMessage( content ); warning.setButtons( new Object[GwtMessageBox.ACCEPT] ); warning.setAcceptLabel( Messages.getString( "close" ) ); //$NON-NLS-1$ warning.show(); } } } }; RequestBuilder builder = new RequestBuilder( RequestBuilder.GET, GWT.getHostPageBaseURL() + "api/mantle/getAdminContent" ); //$NON-NLS-1$ builder.setHeader( "If-Modified-Since", "01 Jan 1970 00:00:00 GMT" ); builder.setHeader( "accept", "application/json" ); //$NON-NLS-1$ //$NON-NLS-2$ builder.sendRequest( null, internalCallback ); // TO DO Reset the menuItem click for browser and workspace here? } catch ( RequestException e ) { //ignore } } public native void setupNativeHooks( MantleController controller ) /*-{ $wnd.mantle_isToolbarButtonEnabled = function(id) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return controller.@org.pentaho.mantle.client.ui.xul.MantleController::isToolbarButtonEnabled(Ljava/lang/String;)(id); } $wnd.mantle_setToolbarButtonEnabled = function(id, enabled) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::setToolbarButtonEnabled(Ljava/lang/String;Z)(id, enabled); } $wnd.mantle_doesToolbarButtonExist = function(id) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return controller.@org.pentaho.mantle.client.ui.xul.MantleController::doesToolbarButtonExist(Ljava/lang/String;)(id); } $wnd.mantle_isMenuItemEnabled = function(id) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return controller.@org.pentaho.mantle.client.ui.xul.MantleController::isMenuItemEnabled(Ljava/lang/String;)(id); } $wnd.mantle_setMenuBarEnabled = function(id, enabled) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::setMenuBarEnabled(Ljava/lang/String;Z)(id, enabled); } $wnd.mantle_setMenuItemEnabled = function(id, enabled) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::setMenuItemEnabled(Ljava/lang/String;Z)(id, enabled); } $wnd.mantle_doesMenuItemExist = function(id) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES return controller.@org.pentaho.mantle.client.ui.xul.MantleController::doesMenuItemExist(Ljava/lang/String;)(id); } $wnd.mantle_loadOverlay = function(id) { controller.@org.pentaho.mantle.client.ui.xul.MantleController::loadOverlay(Ljava/lang/String;)(id); } $wnd.mantle_removeOverlay = function(id) { controller.@org.pentaho.mantle.client.ui.xul.MantleController::removeOverlay(Ljava/lang/String;)(id); } $wnd.mantle_registerSysAdminPanel = function(sysAdminPanel) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::registerSysAdminPanel(Lorg/pentaho/mantle/client/admin/JsSysAdminPanel;)(sysAdminPanel); } $wnd.mantle_activateWaitingSecurityPanel = function(okToSwitchToNewPanel) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::activateWaitingSecurityPanel(Z)(okToSwitchToNewPanel); } $wnd.mantle_enableUsersRolesTreeItem = function(enabled) { controller.@org.pentaho.mantle.client.ui.xul.MantleController::enableUsersRolesTreeItem(Z)(enabled); } $wnd.mantle_selectAdminCatTreeTreeItem = function(treeLabel) { //CHECKSTYLE IGNORE LineLength FOR NEXT 1 LINES controller.@org.pentaho.mantle.client.ui.xul.MantleController::selectAdminCatTreeTreeItem(Ljava/lang/String;)(treeLabel); } $wnd.mantle_buildFavoritesAndRecent = function(force) { controller.@org.pentaho.mantle.client.ui.xul.MantleController::buildFavoritesAndRecent(Z)(force); } }-*/; public void enableUsersRolesTreeItem( boolean enabled ) { MantleXul.getInstance().enableUsersRolesTreeItem( enabled ); } public void selectAdminCatTreeTreeItem( String treeLabel ) { MantleXul.getInstance().selectAdminCatTreeTreeItem( treeLabel ); } public void registerSysAdminPanel( JsSysAdminPanel sysAdminPanel ) { sysAdminPanelsMap.put( sysAdminPanel.getId(), sysAdminPanel ); } public void activateWaitingSecurityPanel( boolean activate ) { if ( activate && ( adminPanelAwaitingActivation != null ) ) { for ( int i = 0; i < MantleXul.getInstance().getAdminContentDeck().getWidgetCount(); i++ ) { Widget w = MantleXul.getInstance().getAdminContentDeck().getWidget( i ); if ( adminPanelAwaitingActivation.id.equals( w.getElement().getId() ) ) { ISysAdminPanel sysAdminPanel = sysAdminPanelsMap.get( adminPanelAwaitingActivation.id ); if ( sysAdminPanel != null ) { sysAdminPanel.activate(); } break; } } GWT.runAsync( new RunAsyncCallback() { public void onSuccess() { if ( UserRolesAdminPanelController.getInstance().getId().equals( adminPanelAwaitingActivation.id ) ) { model.loadUserRolesAdminPanel(); UserRolesAdminPanelController.getInstance().getElement().setId( ( UserRolesAdminPanelController.getInstance() ).getId() ); } else if ( ( EmailAdminPanelController.getInstance() ).getId().equals( adminPanelAwaitingActivation.id ) ) { model.loadEmailAdminPanel(); EmailAdminPanelController.getInstance().getElement().setId( ( EmailAdminPanelController.getInstance() ).getId() ); } else if ( ( ContentCleanerPanel.getInstance() ).getId().equals( adminPanelAwaitingActivation.id ) ) { model.loadSettingsPanel(); ContentCleanerPanel.getInstance().getElement().setId( ( ContentCleanerPanel.getInstance() ).getId() ); } else { model.loadAdminContent( adminPanelAwaitingActivation.id, adminPanelAwaitingActivation.url ); } } public void onFailure( Throwable reason ) { } } ); } else if ( !activate ) { adminPanelAwaitingActivation = null; } } public boolean isToolbarButtonEnabled( String id ) { XulToolbarbutton button = (XulToolbarbutton) document.getElementById( id ); return !button.isDisabled(); } public void setToolbarButtonEnabled( String id, boolean enabled ) { XulToolbarbutton button = (XulToolbarbutton) document.getElementById( id ); button.setDisabled( !enabled ); } public boolean doesToolbarButtonExist( String id ) { try { XulToolbarbutton button = (XulToolbarbutton) document.getElementById( id ); return ( button != null ); } catch ( Throwable t ) { return false; } } @Bindable public void setEditContentSelected( boolean selected ) { contentEditBtn.setSelected( selected, false ); } @Bindable public void openClicked() { model.executeOpenFileCommand(); } @Bindable public void newClicked() { model.launchNewDropdownCommand( newBtn ); } @Bindable public void saveClicked() { model.executeSaveCommand(); } @Bindable public void saveAsClicked() { model.executeSaveAsCommand(); } @Bindable public void showNavigatorClicked() { boolean show = !model.isShowNavigatorSelected(); model.setShowNavigatorSelected( show ); // toggle first ShowBrowserCommand showBrowserCommand = new ShowBrowserCommand( show ); showBrowserCommand.execute(); } @Bindable public void setSaveEnabled( boolean flag ) { // called by the MainToolbarModel to change state. saveBtn.setDisabled( !flag ); } @Bindable public void setSaveAsEnabled( boolean flag ) { // called by the MainToolbarModel to change state. saveAsBtn.setDisabled( !flag ); } @Override public String getName() { return "mantleXulHandler"; //$NON-NLS-1$ } @Bindable public void executeCallback( String jsScript ) { executeJS( model.getCallback(), jsScript ); } @Bindable public void executeMantleFunc( String funct ) { executeMantleCall( funct ); } private native void executeMantleCall( String js ) /*-{ try{ $wnd.eval(js); } catch (e){ try { console.warn( "Error invoking: " + js + ": " + e.message ); } catch ( ignore ) {} } }-*/; private void passivateActiveSecurityPanels( final String idOfSecurityPanelToBeActivated, final String urlOfSecurityPanelToBeActivated ) { adminPanelAwaitingActivation = new SysAdminPanelInfo( idOfSecurityPanelToBeActivated, urlOfSecurityPanelToBeActivated ); int visiblePanelIndex = MantleXul.getInstance().getAdminContentDeck().getVisibleWidget(); if ( visiblePanelIndex >= 0 ) { String visiblePanelId = MantleXul.getInstance().getAdminContentDeck().getWidget( visiblePanelIndex ).getElement().getId(); if ( ( visiblePanelId != null ) && !visiblePanelId.equals( idOfSecurityPanelToBeActivated ) ) { ISysAdminPanel sysAdminPanel = sysAdminPanelsMap.get( visiblePanelId ); if ( sysAdminPanel != null ) { sysAdminPanel.passivate( new AsyncCallback<Boolean>() { public void onFailure( Throwable caught ) { } public void onSuccess( Boolean passivateComplete ) { if ( passivateComplete ) { activateWaitingSecurityPanel( passivateComplete ); } } } ); } else { activateWaitingSecurityPanel( true ); } } else { activateWaitingSecurityPanel( false ); } } else { activateWaitingSecurityPanel( true ); } } @Bindable public void loadAdminContent( final String panelId, final String url ) { passivateActiveSecurityPanels( panelId, url ); } @Bindable public void loadSettingsPanel() { GWT.runAsync( new RunAsyncCallback() { public void onSuccess() { String contentCleanerPanelId = ContentCleanerPanel.getInstance().getId(); if ( !sysAdminPanelsMap.containsKey( contentCleanerPanelId ) ) { sysAdminPanelsMap.put( contentCleanerPanelId, ContentCleanerPanel.getInstance() ); } loadAdminContent( contentCleanerPanelId, null ); } public void onFailure( Throwable reason ) { } } ); } @Bindable public void loadUserRolesAdminPanel() { GWT.runAsync( new RunAsyncCallback() { public void onSuccess() { if ( overrideContentPanelId != null && overrideContentUrl != null ) { loadAdminContent( overrideContentPanelId, overrideContentUrl ); overrideContentPanelId = null; overrideContentUrl = null; } else { String usersAndGroupsPanelId = UserRolesAdminPanelController.getInstance().getId(); if ( !sysAdminPanelsMap.containsKey( usersAndGroupsPanelId ) ) { sysAdminPanelsMap.put( usersAndGroupsPanelId, UserRolesAdminPanelController.getInstance() ); } loadAdminContent( usersAndGroupsPanelId, null ); } } public void onFailure( Throwable reason ) { } } ); } @Bindable public void loadEmailAdminPanel() { GWT.runAsync( new RunAsyncCallback() { public void onSuccess() { String emailPanelId = EmailAdminPanelController.getInstance().getId(); if ( !sysAdminPanelsMap.containsKey( emailPanelId ) ) { sysAdminPanelsMap.put( emailPanelId, EmailAdminPanelController.getInstance() ); } loadAdminContent( emailPanelId, null ); } public void onFailure( Throwable reason ) { } } ); } @Bindable public void executeMantleCommand( String cmd ) { String js = "executeCommand('" + cmd + "')"; //$NON-NLS-1$ //$NON-NLS-2$ executeMantleCall( js ); } private native void executeJS( JavaScriptObject obj, String js ) /*-{ try{ var tempObj = obj; eval("tempObj."+js); } catch (e){ $wnd.mantle_showMessage("Javascript Error",e.message+" "+"tempObj."+js); } }-*/; @Bindable public native void openUrl( String title, String name, String uri ) /*-{ try { $wnd.eval("openURL('"+name+"','"+title+"','"+uri+"')"); } catch (e) { $wnd.mantle_showMessage("Javascript Error",e.message); } }-*/; @Bindable public void setContentEditEnabled( boolean enable ) { contentEditBtn.setDisabled( !enable ); } @Bindable public void setContentEditSelected( boolean selected ) { contentEditBtn.setSelected( selected ); } @Bindable /* * Notifies currently active Javascript callback of an edit event. */ public void editContentClicked() { // set delay for edit/view mode switching setContentEditEnabled( false ); Timer loadOverlayTimer = new Timer() { public void run() { setContentEditEnabled( true ); } }; loadOverlayTimer.schedule( 1800 ); model.setContentEditToggled(); executeEditContentCallback( SolutionBrowserPanel.getInstance().getContentTabPanel().getCurrentFrame().getFrame() .getElement(), model.isContentEditSelected() ); } @Bindable public void printClicked() { model.executePrintCommand(); } private native void executeEditContentCallback( Element obj, boolean selected ) /*-{ try { obj.contentWindow.editContentToggled(selected); } catch (e){if(console){console.log(e);}} }-*/; public MantleModel getModel() { return model; } public void setModel( MantleModel model ) { this.model = model; } public boolean isMenuItemEnabled( String id ) { XulMenuitem item = (XulMenuitem) document.getElementById( id ); return !item.isDisabled(); } public void setMenuItemEnabled( String id, boolean enabled ) { XulMenuitem item = (XulMenuitem) document.getElementById( id ); item.setDisabled( !enabled ); } public void setMenuBarEnabled( String id, boolean enabled ) { XulMenubar bar = (XulMenubar) document.getElementById( id ); bar.setVisible( enabled ); } public void setToolBarButtonEnabled( String id, boolean enabled ) { XulToolbarbutton button = (XulToolbarbutton) document.getElementById( id ); button.setVisible( enabled ); } public boolean doesMenuItemExist( String id ) { try { XulMenuitem item = (XulMenuitem) document.getElementById( id ); return ( item != null ); } catch ( Throwable t ) { return false; } } @Bindable public boolean isSaveEnabled() { return !saveMenuItem.isDisabled(); } @Bindable public boolean isSaveAsEnabled() { return !saveAsMenuItem.isDisabled(); } @Bindable public void propertiesClicked() { model.executePropertiesCommand(); } @Bindable public void shareContentClicked() { model.executeShareContent(); } @Bindable public void scheduleContentClicked() { model.executeScheduleContent(); } @Bindable public void useDescriptionsForTooltipsClicked() { boolean checked = ( (PentahoMenuItem) useDescriptionsMenuItem.getManagedObject() ).isChecked(); ( (PentahoMenuItem) useDescriptionsMenuItem.getManagedObject() ).setChecked( !checked ); model.toggleUseDescriptionsForTooltips(); } @Bindable public void showHiddenFilesClicked() { boolean checked = ( (PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject() ).isChecked(); ( (PentahoMenuItem) showHiddenFilesMenuItem.getManagedObject() ).setChecked( !checked ); SolutionBrowserPanel.getInstance().toggleShowHideFilesCommand.execute(); } @Bindable public void refreshContent() { model.refreshContent(); } @Bindable public void documentationClicked() { model.openDocumentation(); } @Bindable public void kettleStatusPageClicked() { model.openKettleStatusPage(); } public void loadOverlay( String id ) { // TODO We need to convert ths to use the common interface method, // once they become available GwtXulDomContainer container = (GwtXulDomContainer) getXulDomContainer(); try { container.loadOverlay( id ); } catch ( XulException e ) { // TODO Auto-generated catch block e.printStackTrace(); } } public void removeOverlay( String id ) { // TODO We need to convert ths to use the common interface method, // once they become available GwtXulDomContainer container = (GwtXulDomContainer) getXulDomContainer(); try { container.removeOverlay( id ); } catch ( XulException e ) { // TODO Auto-generated catch block e.printStackTrace(); } } } enum PickListType { FAVORITE( "clearFavoriteList", "clearFavoriteItemsMessage" ), RECENT( "clearRecentList", "clearRecentItemsMessage" ); String menuItemKey = null; String messageKey = null; PickListType( String menuItemKey, String messageKey ) { this.menuItemKey = menuItemKey; this.messageKey = messageKey; } String getMenuItemKey() { return this.menuItemKey; } String getMessageKey() { return this.messageKey; } }